AI 時代,做一份表單只要 20 分鐘:R Shiny + AI 的最短路徑
從上一篇接下來
上一篇《AI 之前,做一份「可以填的表單」要走哪條路?》整理了四條傳統路:Excel + VBA、Access、LibreOffice Base、可填寫 PDF。四條路都能做出結果,但每一條都要學一堆東西、每一條都在維護時卡住。
這篇走另一條路。
為什麼是 R Shiny
R Shiny 是 R 語言的「網頁 App 框架」。你寫幾十行 R,執行一下,瀏覽器上就跑出一個網頁。使用者在這個網頁上填表、按按鈕、下載檔案,就跟一般網站一樣。
它剛好對上表單的所有需求:
- 在瀏覽器上跑——手機、平板、任何裝置都能填,不必裝任何東西
- 輸入元件全套:文字、下拉、單選、複選、日期、滑桿、檔案上傳,都有內建元件
- 資料立刻能算、立刻能存:因為背後是 R,資料進來當下就可以做統計、做圖、寫回檔案
- 免費、跨平台:R 是 open source,Windows / Mac / Linux 都跑
- 佈署選擇多:本機跑、公司內網跑、雲端(shinyapps.io / Posit Connect)跑,任選
以前 R Shiny 的門檻在「要會寫 R」。這個門檻,AI 已經幫你降下來了。
一個真實的表單,60 行 R 程式
下面這個範例只有約 60 行,功能包含:
- 三個輸入欄位:姓名(文字)、電話(文字)、地區(下拉:北中南東)
- 新增資料按鈕:把當下填的內容加進表格
- 表格即時顯示:每按一次新增,畫面上的表格就多一列
- 下載 Excel 按鈕:把累積的資料下載成
.xlsx
看程式碼就懂了:
library(shiny)
library(writexl)
# 介面
ui <- fluidPage(
titlePanel("資料管理"),
sidebarLayout(
sidebarPanel(
textInput("name", "姓名"),
textInput("phone", "電話"),
selectInput("region", "地區",
choices = c("北部", "中部", "南部", "東部")),
actionButton("add", "新增資料"),
hr(),
downloadButton("downloadData", "下載資料")
),
mainPanel(
tableOutput("dataTable")
)
)
)
# 邏輯
server <- function(input, output, session) {
data <- reactiveVal(data.frame(
姓名 = character(), 電話 = character(), 地區 = character()
))
observeEvent(input$add, {
new_entry <- data.frame(
姓名 = input$name,
電話 = input$phone,
地區 = input$region
)
data(rbind(data(), new_entry))
# 清空欄位,等下一筆
updateTextInput(session, "name", value = "")
updateTextInput(session, "phone", value = "")
})
output$dataTable <- renderTable({ data() })
output$downloadData <- downloadHandler(
filename = function() paste0("輸入資料", Sys.Date(), ".xlsx"),
content = function(file) write_xlsx(data(), file)
)
}
shinyApp(ui = ui, server = server)這份程式碼放到 RStudio 裡按 Run App,瀏覽器立刻打開表單畫面。你在表格裡輸入、按新增、按下載——都能用。
AI 具體幫你做什麼
你不用背 textInput 的參數、也不用記 reactiveVal 是什麼。AI(Claude / ChatGPT / Copilot 都可以)能做的事很清楚:
① 從一句話生出骨架
「幫我用 R Shiny 寫一個表單,欄位有:姓名、電話、地區(下拉:北中南東)、性別、出生日期。可以新增、可以下載成 Excel。」
AI 會直接產出上面那 60 行的雛形。可能不完美,但跑得起來。
② 加欄位、加驗證
「把電話改成必填、格式要 09xx-xxx-xxx」——AI 會幫你加 validate()、regex、還有錯誤訊息。
③ 資料存到資料庫、不只 Excel
「不要下載,改成每筆直接寫進 SQLite」——AI 會幫你換 DBI + RSQLite,改幾行就好。
④ 加使用者登入
「加一個登入畫面,帳號與雜湊密碼從環境變數或身分驗證服務讀取」——AI 可以用 shinymanager、shinyauthr 或外部身分服務建立登入流程。密碼與密鑰不要直接寫在程式碼裡。
⑤ 佈署上線
「怎麼把這個 App 放到 shinyapps.io 讓別人連進來?」——AI 會給你完整的 rsconnect::deployApp() 指令與帳號設定流程。
這五件事,都不用你懂 Shiny 的細節。你只需要知道自己要什麼、看得懂 AI 給你的程式碼大致在做什麼,然後把它跑起來。
對比上一篇的四條路
回到上一篇那張表,把 R Shiny 加進去:
| 方案 | 學習成本 | 多人同時填 | 跨裝置 | 授權費 | AI 幫得上忙 |
|---|---|---|---|---|---|
| Excel + VBA | 中 | ❌ | ❌ | 有(Office) | 部分 |
| Access 表單 | 高 | ⚠️(易鎖死) | ❌(Windows only) | 有 | 少 |
| LibreOffice Base | 中高 | ⚠️ | ❌ | 免費 | 少 |
| 可填寫 PDF | 低(會用軟體) | ✅(發 30 份) | ✅ | 有(Acrobat Pro) | 少 |
| R Shiny + AI | 低(AI 代寫) | ✅ | ✅(瀏覽器) | 免費 | 全流程 |
這條路的邊界
R Shiny + AI 不是萬能。有幾件事它並不擅長:
① 完全客製的 UI 動畫、複雜的前端互動
Shiny 的元件雖然齊全,但要做完全客製的視覺設計(例如像 Notion 那種細膩的互動),要花的力氣不比另外寫 React 少。日常內部用不太會遇到這個需求。
② 極高流量的公開網站
Shiny 一個 R process 服務一個或多個 session。要撐幾千個同時上線的使用者,需要 Posit Connect / ShinyProxy 這類商用方案,不是免費的。內部單位用完全沒問題。
③ 沒有 R 環境的電腦
要跑 Shiny,總得有一台裝了 R 的電腦(或雲端主機)。但你不需要每台電腦都裝——伺服器一台就夠,其他人瀏覽器連進來。
一個實用的起手式
如果你想試,我建議這樣走:
第 1 步:把上面 60 行貼進 RStudio
裝好 R + RStudio(都免費),開一個新的 app.R,把上面的程式碼貼進去。按 Run App——瀏覽器就會打開。先確認你的環境跑得起來,其他都可以之後再說。
第 2 步:改成你自己的欄位
把姓名、電話、地區改成你單位真正要收的東西。改的時候會遇到「多選要怎麼寫」、「日期怎麼放」——這時候問 AI:「Shiny 裡多選欄位怎麼寫?」直接貼答案回來試。
第 3 步:把資料存下來
downloadButton 是「等使用者按了才下載」——但你可能希望每筆進來就自動存下來。多人使用的 App 建議改寫 SQLite,透過 DBI + RSQLite 新增資料;這比多個連線同時追加 CSV 穩定。
第 4 步:讓別人連進來
同一台區網內?跟 AI 說:「怎麼讓 Shiny app 綁 0.0.0.0,讓區網內的人都能連?」——就是加一行 options(shiny.host = "0.0.0.0", shiny.port = 3838)。
四步下來,一個能真正用的表單就在跑了。
這一系列的重點
上一篇:AI 之前,做表單有四條路,每條都要學一堆、每條都有痛點。
這一篇:AI 之後,門檻降到「你能描述你要什麼」——剩下的 AI 補上。
差別不是「多了一個工具選項」,是選擇工具的邏輯反過來了:
以前是「我會 VBA,所以我用 VBA」;現在是「我要一個能跑在瀏覽器上、多人同時填、直接存資料庫的表單——AI 用 R Shiny 幫我寫」。工具選擇的第一步,從「我會什麼」變成「我要什麼」。
如果要用在正式單位流程
R Shiny + AI 很適合快速做出內部工具原型;若要長期使用,仍需要確認資料儲存、權限、備份、部署位置與維護責任。
相關方向可看:解決方案。